/**
     二维数组：
     声明：
     1. 二维数组是一个数组，所以它符合数组的特点
         a）元素的类型相同
         b）存储的数据个数固定
         c）方便管理数据
     2. 独有的特点：有行有列的表格，单元格就是二维数组的的元素
     3. 语法
         元素类型 数组名[行数][列数];
         int arr[3][4];

     存数据-赋值：
         二维数组真正存储数据的是表格的每一个单元格，元素
         所以在存储数据的时候 必须要确定 到底要存到哪一个元素之中
         使用下标来确定二维数组中的元素，二维数组的元素下标有两个，行下标 列下标
             二维数组[行下标][列下标] = 数据；
             int arr[3][4];
             arr[1][2] = 100;
     取数据：
         二维数组[行下标][列下标]；
     
     遍历：
         for (int i = 0; i < 3; i ++) {
            for (j = 0; j < 4; j ++) {
                printf(“%d”, arr[i][j]);
            }
         }
 
     注意：
     1. 关于二维数组的行数和列数
         a. 声明的时候必须要制定行数和列数
         b. 行数和列数可以使常亮，变量，宏，表达式，也可以是1也可以是0，不能使小数，负数；
     2. 关于元素默认值
         可以不赋值，值是垃圾值
     
     3. 初始化
         1）
             a. 先声明在初始化
             b. 在声明的同时，就初始化数组的每一个元素
             c. 里面有大括弧的时候，可以省略行数
             int arr[3][4]={{1, 2, 3. 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
             d. 里面没有括号的时候，编译器自动判断
             int arr[3][4]={1, 2, 3. 4, 5, 6, 7, 8, 9, 10, 11, 12};
         2）部分初始化
             int[3][4] = {0};
 
     1. 从高地址向底地址申请了连续的（行*列*每一个元素占用的字节）个字节空间。
     2. 第0行是在低字节
         二维数组在内存中任然是1块连续的空间，并不是一个表格
         第0行在低字节
     3. 二维数组的本质：
         二维数组其实是一个一维数组
         只不过，这个一维数组的每一个元素的类型又是一个数组
     
         int arr[2][3];
         这其实是一个一维数组，这个一维数组的长度是2，只不过这个一维数组的元素类型是一个长度为3的数组
         
         所以，二维数组的每一行，其实就是一个一维数组
         
         二维数组地址 = 二维数组的低字节的地址 = 第0行的地址 = 第0行第0列元素的地址 = 二维数组名
         
         长度
             行数 = 总字节数 / 每一行占的字节数
         
             列数 = 每一行的字节数 / 每一个元素的字节数
         
             长度（真正元素的个数） = 二维数组占用总得字节数 / 每一个元素占用的字节数
             长度 = 行数 * 列数
         
         注意：列数不能省略
 
 */

#include <stdio.h>

void setValue(int rows, int clos, int arr[][clos]) {
    for (int i = 0; i < rows; i ++) {
        for (int j = 0; j < rows; j ++) {
            arr[i][j] = i*j+10;
        }
    }
}

void enummateArr(int rows, int clos, int arr[][clos]) {
    for (int i = 0; i < rows; i ++) {
        for (int j = 0; j < rows; j ++) {
            printf("%d\t", arr[i][j]);
        }
        printf("\n");
    }
}

int main(int argc, const char * argv[]) {
    
    /**
     从控制台接受用户输入的1个二维数组的行数和列数
     1. 然后创建这个二维数组
     2. 写1个函数，为这个二维数组的元素赋值
        元素的值 =（行*列）+10
     3. 在写一个函数，打印二维数组的所有元素
     */
    
    // 从控制台接受用户输入的1个二维数组的行数和列数
    int rows = 0, clos = 0;
    printf("Input rows and clos please: ");
    scanf("%d %d", &rows, &clos);
    
    // 然后创建这个二维数组 写1个函数，为这个二维数组的元素赋值
    int arr[rows][clos];
    setValue(rows, clos, arr);
    // 在写一个函数，打印二维数组的所有元素
    enummateArr(rows, clos, arr);
    
    return 0;
}





